#include <QWidget>
#include <QApplication>
#include <QMainWindow>
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QObject>
#include <QSlider>
#include <QSpinBox>

#include "CalculatorDialog.h"
#include "TimeDialog.h"

int test1(QApplication &a)
{
    QDialog parent1;

    // 如果不移动QDialog，它默认是会居中显示的
    // parent1.move(100, 100);
    parent1.resize(800, 800);

    QLabel label("我是标签", &parent1);
    label.move(20, 40);

    QPushButton btn1("我是按钮", &parent1);
    btn1.move(20, 80);
    btn1.resize(60, 60);

    // 不需要手动释放内存空间，这个控件关联到QDialog上了，parent1销毁时自动释放btn2
    QPushButton *btn2 = new QPushButton("我是按钮", &parent1);
    btn2->move(100, 80);
    btn2->resize(60, 60);


    QWidget parent2;

    // QMainWindow parent3;
    // parent3.show();

    // 实现点击按钮1关闭标签的功能
    QObject::connect(&btn1, SIGNAL(clicked(void)), &label, SLOT(close()));

    // 实现点击按钮2展示标签的功能
    QObject::connect(btn2, SIGNAL(clicked(void)), &label, SLOT(show()));

    // 增加退出按钮，点击按钮关闭应用程序
    QPushButton *btn_quit = new QPushButton("关闭所有窗口(即关闭程序)", &parent1);
    btn_quit->move(250, 80);
    btn_quit->resize(200, 200);

    // 这里接收信号的对象是QApplication类，应用程序类，所有这个应用程序的窗口都会被关闭
    QObject::connect(btn_quit, SIGNAL(clicked(void)), &a, SLOT(closeAllWindows()));
    // QObject::connect(btn_quit, SIGNAL(clicked(void)), &a, SLOT(quit()));
    // QObject::connect(btn_quit, SIGNAL(clicked(void)), &a, SLOT(exit()));

    // 如果应用程序内只有一个父窗口，那么接收信号的对象也可以是该窗口
    QPushButton *btn_quit1 = new QPushButton("关闭程序内的其中一个父窗口", &parent1);
    btn_quit1->move(0, 0);
    btn_quit1->resize(180, 30);

    // 由于当前程序内有两个父窗口，所以关闭其中一个时，程序并不会退出，还剩一个窗口
    QObject::connect(btn_quit1, SIGNAL(clicked(void)), &parent2, SLOT(close()));

    parent1.show();
    parent2.show();
    int ret = a.exec();
    // qDebug() << ret;
    return ret;
}


int test2(QApplication &a)
{
    // 创建父窗口
    QDialog parent;
    parent.resize(300, 240);

    // 创建滑块
    QSlider *slider = new QSlider(Qt::Horizontal, &parent);
    slider->move(50, 50);
    slider->setRange(0, 100);

    // 创建选值框
    QSpinBox *spinbox = new QSpinBox(&parent);
    spinbox->move(150, 50);
    spinbox->setRange(0, 100);

    // 滑块滑动(发送信号)影响选值框(接收信号槽)
    QObject::connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));

    // 选值框变化(发送信号)影响滑块滑动(接收信号槽)
    QObject::connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

    parent.show();
    return a.exec();
}

int test3(QApplication &a)
{
    Calculator cal;
    cal.show();
    return a.exec();
}

int test4(QApplication &a)
{
    Timer timer;
    timer.show();
    return a.exec();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // int ret = test1(a);
    // int ret = test2(a);
    // int ret = test3(a);
    int ret = test4(a);
    return ret;
}
